mutexy na win98, padani aplikace
Otázka od: Karel Plechota
22. 6. 2004 10:07
zdravim,
nedavno jsem predelal rizeni threadu v moji aplikaci pomoci mutexu, ale mam
problem. na w2000 aplikace funguje ale na w98 po 5ti minutach spadne. nemuzu
ani odchytit zadnou vyjimku na Application.OnException, win98 proste jen
zahlasi ze doslo k vyjimce a ukonci aplikaci. Kazde exceute v threadu mam v try
- except, veskere veci loguju, ale aplikace stejne zbuchne jako by try except
ani nebylo. mam sanci se nejak dovedet co se stalo?
chtel bych se zeptat - je nejaky znamy problem s mutexy na w98? driv jsem
pouzival kriticke sekce a aplikace fungovala.
dekuji
ps mam Delphi 5 Enterprise
jeste jeden dotaz, muzu si napsat objekt:
TMutex = class
function Enter: boolean;
end;
a metodu:
function TMutex.Enter: boolean;
begin
case WaitForSingleObject( fHandle, fTimeout ) of
WAIT_OBJECT_0 :
.......
a timto zpusobem pouzivat mutexy? neni v tom nejaky problem?
Odpovedá: Petr Fejfar
22. 6. 2004 11:26
Karel Plechota wrote:
> jeste jeden dotaz, muzu si napsat objekt:
> a timto zpusobem pouzivat mutexy? neni v tom nejaky problem?
Kdyz to napises spravne, tak v tom zadny problem neni
> chtel bych se zeptat - je nejaky znamy problem s mutexy na w98? driv
> jsem pouzival kriticke sekce a aplikace fungovala.
Pokud vim, tak jsme na nikdy na zadne problemy s mutexy pod W98 nenarazili.
***
Kdyz si myslis, ze to ma co delat s prechodem od kritickych sekci na mutexy
a mas je zapouzdrene v objektu, tak muzes zkusit napsat spolecneho predka
a zapouzdrit i kritickou sekci. Pak to muzes jednoduse prehazovat tam a
zpatky
a uvidis, jestli to ma co delat s mutexy vs. kritickymi sekcemi.
Jedine co me napada je, ze kriticka sekce nema timeout, takze pokud nemas
spravne osetrenu nedostupnost mutexu, mohlo by se ti stat, ze vlezes nekam,
kde momentalne nemas co delat a tim to zhavaruje.
HTH, pf
Odpovedá: Karel Plechota
24. 6. 2004 21:39
problem s mutexy jsem zda se vyresil. slo o to ze si za behu programu alokuju
mutexy a zase je rusim. pouzival jsem kod ktery tu kdysi byl uvedeny:
fMutex := CreateMutex( nil, false, PChar(fNazev) );
if GetLastError = ERROR_ALREADY_EXISTS then
fMutex := OpenMutex( MUTEX_ALL_ACCESS, false, PChar(fNazev) );
problem je ale v tom ze pokud dojde k volani OpenMutex pak v pameti zustava
handle vracene fci CreateMutex. na to jsou w98 celkem citlive - po case
spadnou.
resenim je proste handle zavrit pres CloseHandle();
good luck
Odpovedá: js-delphi@quick.cz
25. 6. 2004 8:01
Odesilatel: Karel Plechota <karel.plechota@seznam.cz>
> fMutex := CreateMutex( nil, false, PChar(fNazev) );
> if GetLastError = ERROR_ALREADY_EXISTS then
> fMutex := OpenMutex( MUTEX_ALL_ACCESS, false, PChar(fNazev) );
>
> problem je ale v tom ze pokud dojde k volani OpenMutex pak v
> pameti zustava handle vracene fci CreateMutex. na to jsou w98
> celkem citlive - po case spadnou.
>
> resenim je proste handle zavrit pres CloseHandle();
Ahoj.
Prosim Te, jsem asi hodne natvrdly, znamena to, ze to ma vypadat takto:
if GetLastError = ERROR_ALREADY_EXISTS then
begin
fMutex := OpenMutex( MUTEX_ALL_ACCESS, false, PChar(fNazev) );
CloseHandle(fMutex);
end;
Rad bych to delal spravne...
Diky za odpoved.
Jirka
--------------------------------------------------
Ing. Jiri Sokol; jiri.sokol@seznam.cz; 972 231 187
D6Prof+SP3; WinXPProf+SP1; FB 1.0.3
programator amater
Odpovedá: Ondrej Kelle
25. 6. 2004 9:09
> fMutex := CreateMutex( nil, false, PChar(fNazev) );
> if GetLastError = ERROR_ALREADY_EXISTS then
> fMutex := OpenMutex( MUTEX_ALL_ACCESS, false, PChar(fNazev) );
OpenMutex je tam zbytocne, ved CreateMutex bud vytvori novy mutex, alebo
otvori uz existujuci mutex.
Ty ho potom otvaras zbytocne este raz.
HTH
TOndrej
Odpovedá: Karel Plechota
25. 6. 2004 12:23
No vypada to ze OpenMutex je tam fakt zbytecne, ale vyzkousene to nemam..
funkcni kod ktery pouzivam je tento :
fMutex := CreateMutex( nil, false, PChar(fNazev) );
if GetLastError = ERROR_ALREADY_EXISTS then
begin
CloseHandle(fMutex);
fMutex := OpenMutex( MUTEX_ALL_ACCESS, false, PChar(fNazev) );
end;
Otazkou zustava k cemu je dobra funkce OpenMutex kdyz CreateMutex by bylo
dostacujici.
> OpenMutex je tam zbytocne, ved CreateMutex bud vytvori novy mutex, alebo
> otvori uz existujuci mutex.
> Ty ho potom otvaras zbytocne este raz.
Odpovedá: Ondrej Kelle
25. 6. 2004 12:25
> Otazkou zustava k cemu je dobra funkce OpenMutex kdyz
> CreateMutex by bylo dostacujici.
Asi pre pripad, ze chces otvorit mutex, ak existuje, ale nevytvarat ho, ak
neexistuje
HTH
TOndrej